package com.cloud.common.util;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.*;

/**
 * 
 * <h2>文件块整合操作工具</h2>
 * <p>
 * 该工具内包含了对文件系统中文件块的所有操作，使用IOC容器进行管理。
 * </p>
 * 
 * @author mi
 */
@Component
public class FileBlockUtil {


	@Value("${file-manager.volumes[0].path}")
	public  String fileBlocks;
	/**
	 * 
	 * <h2>将新上传的文件存入文件系统</h2>
	 * <p>
	 * 将一个MultipartFile类型的文件对象存入节点，并返回保存的路径名称。其中，路径名称使用“file_{UUID}.block”
	 * （存放于主文件系统中）或“{存储区编号}_{UUID}.block”（存放在指定编号的扩展存储区中）的形式。
	 * </p>
	 * 
	 * @param f MultipartFile 上传文件对象
	 * @param pathName projectPathName 项目路径（可有可无）
	 */
	public String saveToFileBlocks(final MultipartFile f, final String pathName) {

		String originalFileName = new String(f.getOriginalFilename().getBytes(Charset.forName("UTF-8")),
				Charset.forName("UTF-8"));
		// 尝试将其存放至主文件系统路径下
		//获取文件格式
		String fileType = originalFileName.substring(originalFileName.lastIndexOf("."));
		final String id = UUID.randomUUID().toString().replace("-", "");


		String path = pathName +"file_" + id + fileType;
		System.out.println(path);
		final File file = new File(fileBlocks+ path);
			//首先创建父类文件夹
		if(!file.getParentFile().exists()){

			file.getParentFile().mkdirs();      //为什么用mkdirs()呢？因为这个方法可以在不知道偶没有父类文件夹的情况下，创建文件夹，而mkdir（）必须在有父类的文件夹下创建文件
		}
		try {
			f.transferTo(file);
			return path;
		} catch (Exception e) {
			e.printStackTrace();
			return MsgCode.ERROR_CODE;
		}
	}


	/**
	 * <h2>将新上传的base64编码转换成为图片存入文件系统</h2>
	 *
	 * @param imgBase64Str base64编码 格式
	 * @param pathName  项目路径（可有可无）
	 */
	public String uploadPicByBase64(final String imgBase64Str, final String pathName) {
		OutputStream out = null;
		// 判断获取的base65编码是否为空
		if (StringUtils.isBlank(imgBase64Str)) {
			return MsgCode.ERROR_CODE;
		}
		final String imgName = UUID.randomUUID().toString().replace("-", "")+ ".jpg";
		//对图片内容进行预处理
		String newImgBase64Str = imgBase64Str.replace("data:image/jpeg;base64,", "");
		newImgBase64Str = newImgBase64Str.replace(" ", "+").replace("\r\n", "");
		try {
			//对图片内容BASE64解码，还原成图片
			BASE64Decoder decoder = new BASE64Decoder();
			byte[] b = decoder.decodeBuffer(newImgBase64Str);
			for (int i = 0; i < b.length; ++i) {
				if (b[i] < 0) {
					b[i] += 256;
				}
			}


			String path =  pathName +"file_" + imgName;
			System.out.println(path);
			final File file = new File(fileBlocks +path);
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
			//生成jpg图片,最终图片写的位置
			out = new FileOutputStream(fileBlocks+path);
			out.write(b);
			out.flush();
			return path;
		} catch (Exception e) {
			e.printStackTrace();
			return MsgCode.ERROR_CODE;
		}
	}


}
